package base

/**
分组声明
 */
import (
	"fmt"
	"errors"
)

//全局变量
var a = 3.14
//常量
const P = 3.1415926

const (
	i      = 100
	pi     = 3.1415
	prefix = "Go_"
)

func Test1_001() {
	fmt.Println("你好，GO")
	fmt.Println("https://github.com/astaxie")
	fmt.Printf("Hello, world or 你好，世界 or καλημ ́ρα κóσμ or こんにちはせかい\n")
}

func Test1_002() {
	// 定义一个string变量
	// Go对于已声明但未使用的变量会在编译阶段报错
	var name string
	name = "天道酬勤"
	var lenCount = len(name)
	fmt.Println(lenCount)

	//一次性定义多个变量
	// 当使用 := 时可以不适用var修饰
	var str1, str2, str3 string
	str1 = "123"
	str2 = "abc"
	str3 = "您好"
	len := len(str1) + len(str2) + len(str3)
	fmt.Println(len)

	// 定义时初始化
	var table string = "表格"
	fmt.Println(table)
}

func Test1_003() {
	//可以直接忽略类型声明
	var str1, str2, str3 = "111", "222", "333"
	fmt.Println(str1)
	fmt.Println(str2)
	fmt.Println(str3)

	//或是 直接使用 :=
	//:=这个符号直接取代了var和type,这种形式叫做简短声明
	//这种方式 只能用在函数内部 在函数外部使用则会无法编译通过
	//所以一般用var方式来定义全局变量
	str4, str5, str6 := "444", "555", "666"
	fmt.Println(str4)
	fmt.Println(str5)
	fmt.Println(str6)
}

func Test1_004() {
	// _（下划线）是个特殊的变量名，任何赋予它的值都会被丢弃
	_, b := 34, 35
	fmt.Println(b)
}

func Test1_005() {
	//Go 常量和一般程序语言不同的是，可以指定相当多的小数位数(例如200位)
	i := 0.12334454765787687897897956786797089089086576575675675645543536457
	fmt.Println(i)
}

var isActive bool                   // 全局变量声明
var enabled, disabled = true, false // 忽略类型的声明

func Test1_006() {

	var available bool // 一般声明
	valid := false     // 简短声明
	//available = true   // 赋值操作

	fmt.Println(isActive)
	fmt.Println(enabled)
	fmt.Println(disabled)

	fmt.Println(available)
	fmt.Println(valid)
}

func Test1_007() {
	//整数类型有无符号和带符号两种 Go同时支持int和uint
	//Go里面也有直接定义好位数的类型：rune, int8, int16, int32, int64和byte, uint8, uint16, uint32, uint64
	//其中rune是int32的别称，byte是uint8的别称
	//需要注意的一点是，这些类型的变量之间不允许互相赋值或操作，不然会在编译时引起编译器报错
	//另外，尽管int的长度是32 bit, 但int 与 int32并不可以互用

	//浮点数的类型有float32和float64两种（没有float类型），默认是float64

	var a int8 = 4
	var b int16 = 4
	var c int32 = 4
	var d int64 = 4
	var e int = 4

	fmt.Println(a, b, c, d, e)

	var f1 float32 = 3.14
	var f2 float64 = 6.28
	fmt.Println(f1, f2)

	var f3 = 3.14
	fmt.Println(f3)
	//fmt.Println(f2 + f1)//编译报错
	fmt.Println(f2 + f3)
}

func Test1_008() {
	//Go还支持复数。它的默认类型是complex128（64位实数+64位虚数）
	//也有complex64(32位实数+32位虚数)
	//复数的形式为RE + IMi，其中RE是实数部分，IM是虚数部分，而最后的i是虚数单位
	var c complex64 = 5 + 5i
	//output: (5+5i)
	fmt.Printf("Value is: %v", c)
}

func Test1_009() {
	s := "hello"
	c := []byte(s) // 将字符串 s 转换为 []byte 类型
	c[0] = 'H'
	s2 := string(c) // 再转换回 string 类型
	fmt.Printf("%s\n", s2)

	s = "hello,"
	m := " world"
	a := s + m
	fmt.Printf("%s\n", a)

	s = "hello"
	s = "c" + s[1:] // 字符串虽不能更改，但可进行切片操作
	fmt.Printf("%s\n", s)

	m = `hello
    world`
	fmt.Printf("%s\n", m)
}

func Test1_010() {
	//o内置有一个error类型，专门用来处理错误信息，
	// Go的package里面还专门有一个包errors来处理错误
	err := errors.New("emit macho dwarf: elf header corrupted")
	if err != nil {
		fmt.Print(err)
	}
}

func Test1_011() {
	var (
		j       int     = 8
		pj      float32 = 6.66
		prefixj string  = "xxx"
	)
	fmt.Print(j, pj, prefixj)
}
